package com.sunrise.comunicacao.servico;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.annotation.Resource;

import lombok.Getter;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.sunrise.comunicacao.enums.TipoStatusSMS;
import com.sunrise.comunicacao.repositorio.iface.BlackListDao;
import com.sunrise.comunicacao.repositorio.iface.ComunicacaoSMSDao;
import com.sunrise.comunicacao.repositorio.iface.ContaSmsDao;
import com.sunrise.comunicacao.repositorio.iface.RetornoSMSDao;
import com.sunrise.comunicacao.util.SMSUtil;
import com.sunrise.configuracoes.repositorio.iface.PessoaDao;
import com.sunrise.generico.entidade.BlackList;
import com.sunrise.generico.entidade.ComunicacaoSMS;
import com.sunrise.generico.entidade.ContaSms;
import com.sunrise.generico.entidade.DestinatarioSMS;
import com.sunrise.generico.entidade.Pessoa;
import com.sunrise.generico.entidade.RetornoSMS;
import com.sunrise.generico.entidade.Usuario;
import com.sunrise.generico.repositorio.iface.DestinatarioSMSDao;
import com.sunrise.generico.visao.Filtro;

@Service
@Transactional(readOnly = true)
public class ManterComunicacaoSMSService {

	@Resource(name = "comunicacaoSMSDaoImpl")
	@Getter
	private ComunicacaoSMSDao comunicacaoSMSDAO;

	@Resource(name = "destinatarioSMSDaoImpl")
	@Getter
	private DestinatarioSMSDao destinatarioSMSDAO;

	@Resource(name = "blackListDaoImpl")
	@Getter
	private BlackListDao blackListDAO;
	
	@Resource(name = "retornoSMSDaoImpl")
	@Getter
	private RetornoSMSDao retornoSMSDAO;

	@Resource(name = "pessoaDaoImpl")
	@Getter
	private PessoaDao pessoaDAO;

	@Resource(name = "contaSmsDaoImpl")
	@Getter
	private ContaSmsDao contaSmsDAO;
	
	@Transactional(readOnly = false)
	public void carregarDestinatariosValidos(ComunicacaoSMS entidade) {
		for(DestinatarioSMS dest : entidade.getDestinatarios() ){
			dest.setStatus(TipoStatusSMS.ENTREGUEOPERADORA);
			getDestinatarioSMSDAO().alterar(dest);
		}
		
	}
	
	public Collection<ComunicacaoSMS> buscarPorFiltros(Filtro comunicacaoSMS) {
		Collection<ComunicacaoSMS> comunicacoes = getComunicacaoSMSDAO().buscarPorFiltros(comunicacaoSMS);
		for (ComunicacaoSMS com : comunicacoes) {
			com.getDestinatarios().size();
			com.getRetornos().size();
		}
		return comunicacoes;
	}

	public List<Pessoa> listarPessoasPorFiltro(Filtro filtro) {
		return getPessoaDAO().listarPorFiltrosComCelular(filtro);
	}

	public Collection<DestinatarioSMS> adicionarPessoasSelecionados(Pessoa[] pessoasSelecionados,
			ComunicacaoSMS comunicacao) {
		Collection<DestinatarioSMS> pessoas = new ArrayList<DestinatarioSMS>();
		for (Pessoa user : pessoasSelecionados) {
			if (SMSUtil.celularValido(user.getContato().getCelular())) {
				Boolean inserido = false;
				if (!comunicacao.getDestinatarios().isEmpty()) {
					for (DestinatarioSMS pessoa : comunicacao.getDestinatarios()) {
						if (pessoa.getId() != null && pessoa.getId().equals(user.getId())
								|| (user.getContato().getCelular().equals(SMSUtil.limparCelular(pessoa.getCelular())))) {
							inserido = true;
						}
					}
				}
				if (!inserido) {
					user.getContato().setCelular(SMSUtil.limparCelular(user.getContato().getCelular()));
					pessoas.add(criarDestinatarioSMS(user));
				}
			}
		}

		return pessoas;
	}

	public DestinatarioSMS criarDestinatarioSMS(Pessoa pessoa) {
		DestinatarioSMS destSMS = new DestinatarioSMS();
		destSMS.setCelular(pessoa.getContato().getCelular());
		destSMS.setCnpj(pessoa.getCnpj());
		destSMS.setCpf(pessoa.getCpf());
		destSMS.setDataNascimento(pessoa.getDataNascimento());
		destSMS.setNome(pessoa.getNome());
		destSMS.setEmail(pessoa.getContato().getEmail());
		destSMS.setNomeFantasia(pessoa.getNomeFantasia());
		destSMS.setStatus(TipoStatusSMS.ENTREGUEOPERADORA);
		return destSMS;
	}

	public Collection<Pessoa> listarPessoaPorNome(String nome) {
		return getPessoaDAO().listarPorNome(nome);
	}

	@Transactional(readOnly = false)
	public void inserir(ComunicacaoSMS entidade) {
		for (DestinatarioSMS dest : entidade.getDestinatarios()) {
			getDestinatarioSMSDAO().inserir(dest);
		}

		if (entidade.getRetornos() != null) {
			for (RetornoSMS ret : entidade.getRetornos()) {
				getRetornoSMSDAO().inserir(ret);
			}
		}

		getComunicacaoSMSDAO().inserir(entidade);
	}

	@Transactional(readOnly = false)
	public void alterar(ComunicacaoSMS entidade) {
		for (DestinatarioSMS dest : entidade.getDestinatarios()) {
			if (dest.getId() == null) {
				getDestinatarioSMSDAO().inserir(dest);
			}
		}
		if (entidade.getRetornos() != null) {
			for (RetornoSMS ret : entidade.getRetornos()) {
				getRetornoSMSDAO().inserir(ret);
			}
		}
		getComunicacaoSMSDAO().alterar(entidade);
	}

	public List<BlackList> listarBlacklist() {
		return getBlackListDAO().listarAtivos();
	}

	@Transactional(readOnly = false)
	public void removerBlacklist(DestinatarioSMS destBlackList) {
		BlackList blacklist =  getBlackListDAO().buscarPorCelular(SMSUtil.adicionarMascaraCelular(destBlackList.getCelular()));
		blacklist.setAtivo(Boolean.FALSE);
		getBlackListDAO().alterar(blacklist);
	}

	public Collection<ContaSms> listarContasPorUsuario(Usuario usuario) {
		return getContaSmsDAO().listarContasPorUsuario(usuario);
	}

}